import sdk from '../index';
import { DataEquip } from "../../shared/face/index";
import { quality, ItemType } from "../../shared/face/enums";
import Counter, { CounterKey } from "./Counter";
import gameCfg from "../../gameCfg";
import MailManage from "./MailManage";

export interface EquipTemplate extends Omit<DataEquip, 'quality'> {
    quality: {
        min: number;
        max: number;
    };
}

class EquipManage {
    private equipTemplates: Map<string, EquipTemplate> = new Map();
    
    constructor() {
    }

    async init() {
        try {
            console.log('初始化装备管理器...');
            const templates = await sdk.db.find('equip_templates');
            if(templates.length){
                this.equipTemplates.clear();
                templates.forEach((template: any) => {
                    this.equipTemplates.set(template.id, template);
                });
            }else{
                // 创建默认装备模板（仅内存，不写入数据库）
                const defaultTemplate: EquipTemplate = {
                    uuid:sdk.tool.common.uuid,
                    strengthenLevel:1,
                    count:1,
                    id: Counter.get(CounterKey.装备ID),
                    name: '默认装备',
                    desc: '默认装备',
                    sys: '魔幻本质',
                    type: '修真',
                    job: '剑修',
                    solt_type: '法宝',
                    attribute: [],
                    skill: [],
                    creator: 'sys',
                    emoji: "🗡️",
                    icon: gameCfg.defaultIcon,
                    quality: {
                        min: quality.D,
                        max: quality.SSR
                    },
                    source: "",
                    createTime: Date.now(),
                    updateTime: Date.now()
                };
                
                // 仅添加到内存缓存
                this.equipTemplates.set(defaultTemplate.id, defaultTemplate);
                
                // 异步保存到数据库（不等待完成）
                this.saveTemplateToDb(defaultTemplate).catch((error: any) => {
                    console.error('保存默认装备模板到数据库失败:', error);
                });
            }
            
            console.log(`装备管理器初始化完成，加载了 ${this.equipTemplates.size} 个装备模板`);
        } catch (error) {
            console.error('装备管理器初始化失败:', error);
        }
    }

    /**
     * 私有方法：将装备模板保存到数据库
     * @param template 完整的装备模板
     */
    private async saveTemplateToDb(template: EquipTemplate): Promise<void> {
        try {
            await sdk.db.insert('equip_templates', template);
            console.log(`装备模板已保存到数据库: ${template.name} (ID: ${template.id})`);
        } catch (error) {
            console.error('保存装备模板到数据库失败:', error);
            throw error;
        }
    }

    /**
     * 保存装备模板到数据库（模板创建即默认可用）
     * @param template 装备模板数据
     * @param creator 创建者ID
     * @returns 保存的模板ID
     */
    async saveTemplate(template: EquipTemplate, creator: string): Promise<string> {
        try {
            const templateId = Counter.get(CounterKey.装备ID);
            const now = Date.now();
            
            const equipTemplate: EquipTemplate = {
                ...template,
                id: templateId,
                createTime: now,
                updateTime: now,
                creator: creator
            };

            // 保存到数据库
            await this.saveTemplateToDb(equipTemplate);
            
            // 更新内存缓存
            this.equipTemplates.set(templateId, equipTemplate);
            
            console.log(`装备模板保存成功: ${template.name} (ID: ${templateId})`);
            
            // 创建者为玩家时，发送创建成功奖励（通过邮件发放装备）
            if (creator !== 'sys') {
                await this.sendCreationReward(templateId, creator);
            }
            
            return templateId;
        } catch (error) {
            console.error('保存装备模板失败:', error);
            throw error;
        }
    }

    /**
     * 根据ID获取装备模板
     * @param id 模板ID
     * @returns 装备模板
     */
    getTemplateById(id: string): EquipTemplate | undefined {
        return this.equipTemplates.get(id);
    }

    /**
     * 获取所有装备模板
     * @returns 所有装备模板
     */
    getAllTemplates(): EquipTemplate[] {
        return Array.from(this.equipTemplates.values());
    }

    /**
     * 随机获取一个装备模板ID
     */
    getRandomTemplateId(): string {
        const all = this.getAllTemplates();
        if (all.length === 0) {
            return '';
        }
        const randomIndex = Math.floor(Math.random() * all.length);
        return all[randomIndex].id;
    }

    /**
     * 获取随机装备模板
     * @returns 随机装备模板，如果没有则返回undefined
     */
    getRandomTemplate(): EquipTemplate | undefined {
        const all = this.getAllTemplates();
        if (all.length === 0) {
            return undefined;
        }
        const randomIndex = Math.floor(Math.random() * all.length);
        return all[randomIndex];
    }

    /**
     * 删除装备模板
     * @param templateId 模板ID
     */
    async deleteTemplate(templateId: string): Promise<boolean> {
        try {
            const template = this.equipTemplates.get(templateId);
            if (!template) {
                console.error(`装备模板不存在: ${templateId}`);
                return false;
            }

            await sdk.db.remove('equip_templates', { id: templateId });
            this.equipTemplates.delete(templateId);
            
            console.log(`装备模板删除成功: ${templateId}`);
            return true;
        } catch (error) {
            console.error('删除装备模板失败:', error);
            return false;
        }
    }

    /**
     * 发送创建成功奖励（通过邮件发放所创建的装备）
     */
    private async sendCreationReward(templateId: string, creator: string): Promise<void> {
        try {
            const template = this.equipTemplates.get(templateId);
            if (!template) {
                console.error(`装备模板不存在，无法发送创建奖励: ${templateId}`);
                return;
            }

            const rewardItems = [
                sdk.prop.createProp({ type: ItemType.装备, id: templateId, count: 1 }),
            ];

            await MailManage.send(
                'admin',
                creator,
                30,
                '装备创建成功',
                `恭喜！您创建的装备"${template.name}"已收录,感谢您的贡献，特此奖励您1件该装备。`,
                rewardItems
            );

            console.log(`创建奖励邮件发送成功: 装备 ${templateId} -> ${creator}`);
        } catch (error) {
            console.error('发送创建奖励邮件失败:', error);
        }
    }
}

export default new EquipManage();